
  #include <iostream>
  #include <fstream>
  #include <cstdlib>
  #include <cstdio>
  //#include <ctype>
  #include <cstring>
  #include <cmath>
  #include <cfloat>
  #include <list>
  
  using namespace std; 
  
  #include "../../mylib.h"
  #include "../gelimits.h"
  #include "../ge_evo.h"
  #include "../../../data/data.h"
  


 // #include "../evo/mylib.h"
 // #include "../evo/ge/ge_evo.h"
 

  /*
  ++++++++++++++++++++++++ Classe DM_POPULATION +++++++++++++++++++++++++++
  *** Definita il: 01/03/04
  Questa classe e' stata definita per contenere degli individui della clas-
  se dm_individual. In pratica, questa classe si differenzia dalla classe
  base solo per la costruttrice della classe, la quale deve creare per l'ap-
  punto individui della classe dm_individual.
  *** Ultima modifica:
  */
  class dm_Population : public Population
  {
  public:
      
     dm_Population(int N, Evolution *evo_ptr);
     /* E' la costruttrice della classe. I parametri N e evo_ptr vengono 
      * passati alla  costruttrice della classe base. 
     */
     void breed();
     /* E' la procedura che genera la popolazione di individui della classe 
        dm_Individual.
     */
     void show_data();
  /* Mostra i dati della popolazione.  
  */  
     friend class dm_Evolution;
     friend class Experiment;
  };
  /*
  +++++++++++++++++++++++++++ classe INDIVIDUAL +++++++++++++++++++++++
  *** Definita il: 
  Gli oggetti di questa classe sono i singoli individui della popola-
  zione e sono degli alberi di generazione di espressioni ottenuti ap-
  plicando le regole della grammatica.
  *** Ultima modifica: ore 17.00 del 04/04/03
  */
  class dm_Individual : public ge_Individual
  {
  public:
     dm_Individual();
     /* E' la costruttrice della classe NON costruisce l'alb ero di deriva-
        zione.
     */
     dm_Individual(bool fit);
     /* E' la seconda costruttrice della classe. Setta la la variabile che definisce 
      * il tipo di fitness. 
     */
     Individual *build_copy();
     /* Costruisce una copia dell'individuo.
     */
     void show(ostream *out_stream);
     /* Visualizza l'individuo.
     */

     bool show_clusters;
     /* Indica all'inseritore della classe se stampare anche i clusters del
        individuo. 
     */
     bool show_clustering;
     /* Indica all'inseritore della classe se stampare anche il clustering
        ottenuto dall'individuo.
     */ 
     int give_valid_clusters(){return valid_clusters;};
     /* Restituisce il numero di cluster validi nell'individuo.
     */
     int give_clusters_num(){return clusters_num;};
     /* Restituisce il numero di cluster totali dell'individuo.
     */
     int give_tot_clauses(){return tot_clauses;};
     /* Restituisce il numero totale di clausole presneti nell'individuo.
     */
     float comp_avg_rec(int data_num);
     /*  calcola la rec rate media per classe.
     */
  protected:
     int clusters_num;
     /* E' il numero di clusters contenuto nell'individuo.
     */
     double iop;
     /* E' l'indice di orientamento alla patologia ottenuto dalla cluste-
        rizzazione rappresentata dall'individuo.
     */
     double match_cover;
     /* E' copertura per matching ottenuta dall'individuo sul data set.
     */
     double comp_fitness();
     /* Calcola la fitness dell'individuo.
     */
     float comp_fold_validation(data_item data_set[], int data_num, int k);
     /* Calcola il valore della k-fold cross validation dell'individuo.         
     */
     void show_matrix(ostream *out_stream);
     /* Mostra sull'output passato come parametro la matrice di verita' del
        individuo. 
     */
   //  private:
     class Cluster clusters[MAX_CLUSTERS];
     /* Questo vettore contiene i clusters presenti nell' individuo.
     */
     memo_item *clustering;
     /* Questo vettore di strutture item memorizza la clusterizzazione ottte-
        nuta dall'individuo.
     */
     
      int truth_matrix[MAX_CLASSES][MAX_CLUSTERS];
     /* E' la matrice di verita' del clustering ottenuto dall'individuo.
     */     
     int valid_clusters;
     /* E' il numero di espressioni valide (quelle che metchano almeno un
        individuo) contenute nell'individuo.
     */
     int valid_clauses;
     /* E' il numero di clausole totale dei clusters validi.
      */
     float train_rate;
     /* E' la rec rate ottenuta sul train set.
     */
     float test_rate;
     /* E' la rec rate ottenuta sul test set.
     */
     float train_cover;
     /* E' la percentuale di copertura ottenuta sul train set.
     */
     float ave_best_percent;
     /* E' il valore medio della percentuale di items che ha nel cluster 
        la classe piu' rappresentata. 
     */
     int tot_clauses;
     /* E' il numero totale di clausole contenute nell'individuo.
     */
     bool avg_fit;
     /* Definisce il tipo di fitness: overall RR o media per classe. 
      */
     double omogeneity;
     /* E' l'omogeneit� del clustering rappresentato dall'individuo.
     */
     double separability;
     /* E' la distanza tra i centroidi totali dei clusters dell'individuo.
     */
     int extract_clusters();
     /* Questa procedura estrae dal fenotipo le espressioni che rappresen-
        tani i clusters dell'individuo e le memorizza nell'array clusters.
     */
     void comp_clustering(data_item data[], int data_num);
     /* Calcola il clustering ottenuto dalle espressioni presenti nel feno-
        tipo dell'individuo sul data set passato come parametro.
     */
     void match_assignament(data_item dataset[], int data_num) ;   
     /* Assegna per matching gli items del Data Set passato come parametro.
     */
     float test_assignament(data_item dataset[], int data_num);
     /* Assegna per matching gli items del Data Set. E' sepcifica della fa-
      * se di testing.
     */    
     void comp_valid_clusters();
     /* Calcola il numero di clusters validi nell'individuo.
     */
     void build_correspondence_vector();
     /* Costruisce il vettore che mette in corrispondenza la posizione. */
     void comp_clauses();
     /* Calcola il numero totale di clausole presenti nell'individuo.
     */          
     void build_matrix(data_item data[], int data_num);
     /* Costruisce la matrice di verita' del clustering ottenuto dall'indi-
     viduo. Il primo parametro specifica il data set clusterizzato, il se-
     condo, invece, specifica il numero di items in esso contenuto.
     */     
     void training(data_item data[], int data_num);
     /* Viene utilizzata per il cross validation test. Effettua il training
        sul train set passato come parametro.
     */
     float testing(data_item data[], int data_num);
     /* Viene utilizzata per il cross validation test. Effettua il test sul
        test set passato come parametro. Restituisce come valore il rec ra-
        ottenuto.  
     */
     void labeling(data_item data[], int data_num);
     /* Viene utilizzata per il cross validation test. Effettua il labeling 
        delle espressioni presenti all'interno dll'individuo. Il primo pa-
        rametro specifica il data set clusterizzato, il secondo, invece, 
        specifica il numero di items in esso contenuto.
     */
     void static_labeling(data_item data[], int data_num);
     /* Effettua il labeling "statico"delle espressioni presenti all'interno dell'individuo. 
      * quello cioè basato sulla posizione dei cluster e non sul risultato 
      * dell'assegnazione.
      * Il primo parametro specifica il data set clusterizzato, il secondo, invece, 
      * specifica il numero di items in esso contenuto.
     */
     float comp_rec_rate(int data_num); 
     /* Calcola e restituisce come valore il rec rate ottenuto dall'indivi-
        duo. Viene calcolato attraverso la truth matrix. Il parametro spe-
        cifica il numero di items del data set testato. 
     */
     void del_not_valids();
     /* Cancella gli alberi che non hanno acquisito nemmeno un items.
     */
      

     
     friend class Evolution; // PROVA
     friend class Population;
     friend class Copy;
     friend class Crossover;
     friend class Mutation;
     friend class dm_Fitness;
     friend ostream &operator<<(ostream &stream, dm_Individual ind);
  };

  //  ********** INSERITORE della classe Individual. **********************
  ostream &operator<<(ostream &stream, dm_Individual ind);
     /* Stampa nel file passato come primo parametro, tutte le informazioni
        dell'individuo. I due parsmetri specificano il tipo di informazione
        da stampare.
     */



   /*
  +++++++++++++++++++++++++++ classe  EVOLUTION +++++++++++++++++++++++
  *** Definita il: 
  E' il vero "cuore" di tutto il programma, sono gli oggetti di questa
  classe, infatti, che contengono le informazioni sul numero di itera-
  zioni da eseguire, sulle percentuali di applicazione dei vari oipera-
  tori, sul tipo di distribuzione da applicare per ognuno degli opera-
  tori ecc.
  *** Ultima modifica: ore 17.00 del 04/04/03
  */

  class dm_Evolution  : public Evolution
  {
  public:

  void start(int argc, char *argv[]);  
  /* E' la procedura che inizializza la classe e avvia l'evoluzione. I pa-
     rametri passti servono alla lettura della riga di comando 
  
  void memo_data_iter();
  /* Memorizza i  dati dell'iterazione specifici dell'applicazione di data
     mining.
  */
  void init_run(int argc, char *argv[]);
  /* Chiama la build_sets, della classe Data.
  */
  void give_more_params(ofstream *out_stream);
  /* Copia nel file passato come parametro la grammatica e i dati.
  */
  double bestclusters_story[MAX_ITERS];
  /* Questo vettore memorizza il numero di clusters del miglior individuo 
     durante il run.
  */
  double bestomo_story[MAX_ITERS];
  /* Questo vettore memorizza l'omogeneita' p del miglior individuo durante il run.
  */
  double bestmatch_story[MAX_ITERS];
  /* Questo vettore memorizza la copertura per matching del miglior indivi-
     duo durante il run.
  */
  bool termination();
  /* E' la procedura che contiene i criteri di terminazione del programma.
  */
  bool extract_more_param(char *line);
  /* Estrae i parametri specifici della classe.
  */  
  bool is_avg_fit(){return avg_fit;}
  bool get_static() {return static_label;}
  
  protected:
  bool cross_sorting, cross_tree, static_label;
  /* tipo di crossover per le liste: 
   * -- ordinato oppure no. 
   * -- ad albero invece che sulla lista.
  */
  bool avg_fit;
  /* tipo di fitness: se è TRUE allora si calcola RR medio per class
   */
  int tree_mult;
  /* fattore di moltiplicazione del massimo numero di alberi
  */
   
  

  
  friend class Population;
  friend void  free_memory();
  friend void memo_best(int run);
  friend class dm_Population;
  };


  /*
  +++++++++++++++++++++++++++ classe FITNESS ++++++++++++++++++++++++++++++
  *** Definita il: 22/12/03
  Questa classe e' utilizzata per calcolare la firnes dell'individuo.

  *** Ultima modifica:
  */
  class dm_Fitness : public Fitness
  {
  public:

     double eval(Individual *ind_ptr);
     /* Calcola la fitness dell'individuo passato come parametro.
     */
     double scaling_factor;
     /* E' il fattore di scala tra omogeneita' e separabilita' del clsutering,
        ed e' usato per il calcolo della fitness.
     */
     double min_fitness;
     /* E' il valore minimo che puo' assumere la fitness di un individuo.
     */
     int max_clauses;
     /* E' il valore massimo di clausole che puo' conrtenere un individuo.
     */

     bool visual;
     /* Specifica se stampare il messaggo di corretta acquisizione.
     */
     bool extract_param(char *line);
     /* Estrae dalla linea di caratteri passata come parametro uno dei parame-
        tri della funzione di fitness. */

  friend int main(int argc, char *argv[]);
  };

